package com.hb.core.pojo.center.au.dto;

import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.hb.core.pojo.parent.CopyOperation;
import com.hb.core.pojo.parent.ParamsCheck;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDateTime;
import java.util.Date;

/**
 * 企业专属配置信息
 *
 * @author zhaojk
 * @since 2022-04-12
 */
@Setter
@Getter
@ApiModel(value = "企业专属配置信息DTO对象", description = "企业专属配置信息")
public class OrgCustomConfigDTO implements CopyOperation, ParamsCheck {

    /**
     * 主键ID
     */
    @ApiModelProperty(value = "主键ID", notes = "该字段有值时进行修改操作")
    private Long id;

    /**
     * 企业id
     */
    @ApiModelProperty(value = "企业id", required = true)
    private Long orgId;

    /**
     * 企业名称
     */
    @ApiModelProperty(value = "企业名称")
    private String orgName;

    /**
     * 企业自定义域名(交易平台)
     * 格式：验证格式，只能包括26个英文字母、“0-9”数字和“-.”英文中的连接号，但开头和结尾不能含有连接号，不区分大小写字母
     * 填写域名后系统需要去重，如果一级域名下已有该子域名，则输入框外提示【域名重复，请重新填写】；
     */
    @ApiModelProperty(value = "企业自定义域名(交易平台)", required = true)
    private String domainNameTrade;

    /**
     * 企业自定义域名(门户)
     */
    @ApiModelProperty(value = "企业自定义域名(门户)", required = true)
    private String domainNamePortal;

    /**
     * 企业自定义域名(专家系统)
     */
    @ApiModelProperty(value = "企业自定义域名(专家系统)", required = true)
    private String domainNameExpert;

    /**
     * 公司电话
     */
    @ApiModelProperty(value = "公司电话")
    private String orgPhone;

    /**
     * 公司邮箱
     */
    @ApiModelProperty(value = "公司邮箱")
    private String orgEmail;

    /**
     * 公司地址
     */
    @ApiModelProperty(value = "公司地址")
    private String orgAddress;

    /**
     * 企业自定义logo名称
     */
    @ApiModelProperty(value = "企业自定义logo名称", required = true)
    private String logoName;

    /**
     * 平台定义的后缀名称, 该字段仅作展示用
     */
    @ApiModelProperty(value = "平台定义的后缀名称", required = true)
    private String suffixName;

    /**
     * 企业自定义logo(url地址)
     */
    @ApiModelProperty(value = "企业自定义logo(url地址, 46*46)", required = true)
    private String logoUrl1;

    /**
     * 企业自定义logo(url地址)
     *
     * @deprecated
     */
    @Deprecated
    @ApiModelProperty(value = "企业自定义logo(url地址, 36*36)", required = true)
    private String logoUrl2;

    /**
     * 企业自定义logo(url地址)
     */
    @ApiModelProperty(value = "企业自定义logo(url地址, 32*32)", required = true)
    private String logoUrl3;

    @ApiModelProperty(value = "审核状态")
    private Integer auditStatus;

    @ApiModelProperty(value = "审核时间")
    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime auditTime;

    @ApiModelProperty(value = "审核未通过原因")
    private String reason;

    @ApiModelProperty(value = "提交人名称", required = true)
    private String createName;

    @ApiModelProperty(value = "提交人id", required = true)
    private Long createId;

    @ApiModelProperty(value = "提交时间", required = true)
    @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime  createTime;

    /**
     * 二级域名匹配正则
     */
    private final String REGEX = "^(?!\\-)[a-zA-Z0-9\\-]+(?<!\\-)$";

    @Override
    public String paramsValid(String... fieldNames) {
        if (StrUtil.isEmpty(logoUrl1)) {
            return "请上传企业logo, 46*46";
        }
        if (StrUtil.isEmpty(logoUrl3)) {
            return "请上传企业logo, 32*32";
        }

        if (StrUtil.isNotEmpty(domainNameTrade)) {
            boolean match = ReUtil.isMatch(REGEX, domainNameTrade);
            if (!match) {
                return "[" + domainNameTrade + "]不符合格式, 请修改后提交";
            }
        }
        if (StrUtil.isNotEmpty(domainNamePortal)) {
            boolean match = ReUtil.isMatch(REGEX, domainNamePortal);
            if (!match) {
                return "[" + domainNamePortal + "]不符合格式, 请修改后提交";
            }
        }
        if (StrUtil.isNotEmpty(domainNameExpert)) {
            boolean match = ReUtil.isMatch(REGEX, domainNameExpert);
            if (!match) {
                return "[" + domainNameExpert + "]不符合格式, 请修改后提交";
            }
        }
        return null;
    }

    /**
     * 定制类型枚举
     *
     * @deprecated 分别做为对象属性保存
     */
    @Getter
    @Deprecated
    public static enum ConfigTypeEnum {

        TRADE(1, "交易平台"),
        PORTAL(2, "门户"),
        EXPERT(3, "专家");

        private final Integer code;
        private final String showName;

        ConfigTypeEnum(Integer code, String showName) {
            this.code = code;
            this.showName = showName;
        }
    }

    /**
     * 平台部署模式
     */
    @Getter
    public enum DeployModeEnum {
        SAAS(1, "SAAS"),
        PRIVATIZATION(2, "私有化部署");

        private final Integer code;
        private final String showName;

        DeployModeEnum(Integer code, String showName) {
            this.code = code;
            this.showName = showName;
        }
    }

    /**
     * 专属定制只展示自己信息（专属定制提交页面使用，用于区分是主公司申请还是分公司申请）
     * 1，只展示自己的
     */
    private Integer onlyOne;


    /**
     * 主公司-企业自定义域名(交易平台)
     */
    @TableField(exist = false)
    private String domainNameTradeByMain;
    /**
     * 主公司-企业自定义域名(门户)
     */
    @TableField(exist = false)
    private String domainNamePortalByMain;
    /**
     * 主公司-企业自定义域名(专家系统)
     */
    @TableField(exist = false)
    private String domainNameExpertByMain;

    /**
     * 主公司-审核状态(分公司信息展示使用)
     */
    @TableField(exist = false)
    private Integer auditStatusByMain;

    /**
     * 公司级别（1，主公司，2，分公司）
     */
    @TableField(exist = false)
    private Integer companyLevel;

    /**
     * 企业自定义公司名称
     */
    @TableField(exist = false)
    private String customName;
}
